Unity 世界坐标转UI坐标(Screen Space | 您所在的位置:网站首页 › unity ui相机设置 › Unity 世界坐标转UI坐标(Screen Space |
坐标转换代码 CommonComs.MainCamera 代表我的主摄像机 _CanvasRect 代表我的主界面 问题 : 如果物体和3D摄像机照射的夹角,在0-180 之间( 也就是物体处于以摄像机为参照物的第三、四象限 )那么计算的值,相对应与摄像机X轴为垂直平分线的点。 如下图 : Cube在摄像机(摄像机坐标0,0,0)前后的位置:
这样造成的问题,在不确定物体是否是在摄像机第三四象限的情况下, 举个栗子:本为X轴为负的值,当成X轴为正的值,赋值给UI,本该出现在左下角的UI元素,出现在了右上角。 总结,上下左右颠倒。 解决方法 : 判断物体是否在摄像机的后面,如果是,坐标转换的值,都加负号,再赋予UI上。 如何判断 ? 引入点乘(一条向量在另一条向量上的投影,)顺便说下叉乘(垂直与这两条向量的一条向量) 1.判断目标在自己的前后方位可以使用下面的方法: Vector3 dir = target.position - transform.position; //位置差,方向 Vector3.Dot(transform.forward, dir); 返回值为正时,目标在自己的前方,反之在自己的后方 2.判断目标在自己的左右方位可以使用下面的方法: Vector3.Cross(transform.forward, target.position).y 返回值为正时,目标在自己的右方,反之在自己的左方 为什么取y呢 ,因为 transform.forward实际上是 (0,0,1)*rotation, 也就是只有z有值, cross出来,就只有 y是计算 x和z 的情况,x是计算 y的情况,z是0;因此 左右关系,是由x和z决定的。 有个超好的视频,讲解了点乘和叉乘的原理以及应用,链接:https://www.bilibili.com/video/BV1Z741197KR?from=search&seid=4955967547489981409 本文只需要计算前后方就行了, 方法 ,结果如下图 : Vector3.Angle 弊端: 1、 在一个坐标的位置为Vector3.zero的时候,夹角一直为0; 2、 夹角范围 在 0 ~ 180 ,无法判断两物体相对位置的象限
|
CopyRight 2018-2019 实验室设备网 版权所有 |